//本地状态仓库
import { createPinia } from "pinia";

const pinia = createPinia();

export default pinia;

export enum MsgEnum {
  get = "数据加载成功!",
  add = "数据添加成功!",
  update = "数据修改成功!",
  delete = "数据删除成功!",
}

export enum AclEnum {
  menu = "菜单权限",
  role = "角色职位",
  user = "用户",
}

export const msgFn = (name: AclEnum, msg: MsgEnum) => name + msg;

//#region
/**
 * 函数柯里化返回类型
 */
// type Curried<A, R> = A extends []
//   ? () => R
//   : A extends [infer ARG]
//   ? (params: ARG) => R
//   : A extends [infer ARG, ...infer REST]
//   ? (params: ARG) => Curried<REST, R>
//   : never;

// /**
//  * 函数柯里化
//  * @param fn 函数
//  */
// declare function curry<A extends any[], R>(
//   fn: (...args: A) => R
// ): Curried<A, R>;

//#endregion

/**
 * 柯里化函数
 * @param fn
 * @returns 函数
 */
const curry = (fn: Function) => {
  //... 表示有1个或者更多的参数
  return function curriedFn(...args: any[]) {
    //检查传入的参数args的数目是否小于函数fn的参数的个数
    if (fn.length > args.length) {
      //如果传入的参数个数不够，返回一个函数，并传入上一次的参数
      return function () {
        //重新返回调用curriedFn
        return curriedFn.apply(
          //concat，连接两个或更多的数组，在args后面追加arguments的内容，arguments表示之前传入的参数
          null,
          args.concat([].slice.call(arguments))
        );
      };
    }
    //如果参数符合要求，将所有的参数传入fn函数内部
    return fn.apply(null, args);
  };
};

/**
 * 函数柯里化应用
 */
export const curriedFn = curry(msgFn);
